/*
给定一个链表，删除链表的倒数第 n 个节点，并且返回链表的头结点。

示例：

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后，链表变为 1->2->3->5.
说明：

给定的 n 保证是有效的。

进阶：

你能尝试使用一趟扫描实现吗？

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* cur=head;
        int len=0;
        while(len<=n){
            cur=cur->next;
            len++;
            if(cur==NULL){
                if(len==n){
                    head=head->next;
                    return head;
                }
                break;
            }
        }
        ListNode* last=head;
        while(cur!=NULL){
            last=last->next;
            cur=cur->next;
        }
        last->next=last->next->next;
        return head;
    }
};

// 2020.8.11 town 
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int len = 0;
        ListNode* slow = head;
        ListNode* fast = head;
        while(len != n){
            fast = fast -> next;
            len++;
        }
        if(fast == NULL){
            head = head->next;
        }else{
            while(fast -> next != NULL){
                fast = fast -> next;
                slow = slow -> next;
            }
            slow -> next =  slow -> next -> next;
        }
        
        return head;
    }
};